#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
1.map 将迭代对象中的每一个元素都应用一下func函数，并返回一个新的迭代对象。
2.filter 过滤掉迭代对象中不符合条件的元素，返回一个新的迭代对象。
3.reduce 迭代对象中元素两两之间应用func函数，返回一个单一值。
4.sorted 排序迭代对象。
5.iter 迭代器。
6.next 获取迭代器的下一个元素。
7.zip 合并多个迭代对象。
8.enumerate 迭代对象中元素及其索引。
'''


# map
def square(x):
    return x ** 2


nums = [1, 2, 3, 4, 5]
result = map(square, nums)
print(list(result))  # [1, 4, 9, 16, 25]

print(list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])))

# filter
print(list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])))

# reduce
from functools import reduce

print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]))  # 15
print(reduce(lambda x, y: x * y, [1, 2, 3, 4, 5]))  # 120
print(reduce(lambda x, y: x if x > y else y, [1, 2, 3, 4, 5]))  # 5
print(reduce(lambda x, y: x if x < y else y, [1, 2, 3, 4, 5]))  # 1
print(reduce(lambda x, y: x if x == y else None, [1, 2, 3, 4, 5]))  # None
print(reduce(lambda x, y: x if x == y else x + y, [1, 2, 3, 4, 5]))  # 15
print(reduce(lambda x, y: x if x == y else x * y, [1, 2, 3, 4, 5]))  # 120


# 注意：reduce函数的第三个参数是可选的，如果没有指定，则默认使用第一个元素作为初始值。

# sorted
print(sorted([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]))  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
print(sorted([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5], reverse=True))  # [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower))  # ['about', 'bob', 'Credit', 'Zoo']


# iter
it = iter([1, 2, 3, 4, 5])  # 创建迭代器
print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3
print(next(it))  # 4
print(next(it))  # 5

# zip
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for name, age in zip(names, ages):
    print(name, age)  # Alice 25  Bob 30  Charlie 35

# enumerate
for i, value in enumerate([1, 2, 3, 4, 5]):
    print(i, value)  # 0 1  1 2  2 3  3 4  4 5



